package cn.iocoder.yudao.module.jifenyuan.service.room;

import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.jifenyuan.controller.app.room.vo.*;
import cn.iocoder.yudao.module.jifenyuan.dal.dataobject.room.RoomDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.jifenyuan.dal.dataobject.room.RoomWithBindTypeDO;
import cn.iocoder.yudao.module.jifenyuan.dal.dataobject.roomuserbind.RoomUserBindDO;
import cn.iocoder.yudao.module.jifenyuan.dal.dataobject.roomuserbind.RoomUserBindWithInfoDO;
import cn.iocoder.yudao.module.jifenyuan.dal.dataobject.usercurrentroom.UserCurrentRoomDO;
import cn.iocoder.yudao.module.jifenyuan.enums.JifenyuanRoomEventTypeEnum;
import org.springframework.scheduling.annotation.Async;

/**
 * 记分员 房间 Service 接口
 *
 * @author 芋道源码
 */
public interface RoomService {

    RoomDO selectCurrentLeaderRoom();

    /**
     * 创建记分员 房间
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    RoomDO createRoom(@Valid AppRoomCreateReqVO createReqVO);

    /**
     * 更新记分员 房间
     *
     * @param updateReqVO 更新信息
     */
    void updateRoom(@Valid AppRoomUpdateReqVO updateReqVO);

    /**
     * 删除记分员 房间
     *
     * @param id 编号
     */
    void deleteRoom(Long id);

    /**
     * 获得记分员 房间
     *
     * @param id 编号
     * @return 记分员 房间
     */
    RoomDO getRoom(Long id);

    /**
     * 获得记分员 房间列表
     *
     * @param ids 编号
     * @return 记分员 房间列表
     */
    List<RoomDO> getRoomList(Collection<Long> ids);

    /**
     * 获得记分员 房间分页
     *
     * @param pageReqVO 分页查询
     * @return 记分员 房间分页
     */
    PageResult<RoomDO> getRoomPage(AppRoomPageReqVO pageReqVO);

    /**
     * 获得记分员 房间列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 记分员 房间列表
     */
    List<RoomDO> getRoomList(AppRoomExportReqVO exportReqVO);

    /**
     * 查看是否创建了活跃房间
     * @return
     */
    RoomDO getLiveRoomByLeaderId(Long userId);
    /**
     * 查看当前是否再房间内
     * @return
     */
    RoomWithBindTypeDO checkInRoom();



    /**
     * 离开当前房间
     * @return
     */
    void leaveCurrentRoom();

    void roomTransfer(Long toUserId, Long score);


    List<RoomUserBindDO> getRoomScore();

    List<RoomUserBindWithInfoDO> getRoomPartner();

    RoomDO joinObserverRoom(String observerCode, String cid,String observerSource);

    /**
     * 加入房间
     * @return
     */
    RoomDO joinPartnerRoom(String inviteCode);

    String getRoomObserveImg();

    /**
     * 生成房间分享码
     * @return
     */
    String getRoomShareImg();

    /**
     * 解散房间
     */
    void closeRoom();

    /**
     * 将成员在房间内隐藏，其他观察者无法看到
     */
    void hideSelf();
}
